<!DOCTYPE html>
<html>

	<head>
		<meta charset="UTF-8">
		<title></title>
	</head>

	<body>
		<script>
			(function() {
				var getRandomColor = function() {
					return '#' +
						(function(color) {
							return(color += '0123456789abcdef' [Math.floor(Math.random() * 16)]) &&
								(color.length == 6) ? color : arguments.callee(color);
						})('');
				}
				//				console.log(getRandomColor());
				//				随机生成6个字符然后再串到一起，闭包调用自身与三元运算符让程序变得内敛，
			})();
		</script>
		<script>
			//			把Math对象，用于生成hex颜色值的字符串提取出来，并利用第三个参数来判断是否还继续调用自身。
			var getRandomColor = function() {

				return(function(m, s, c) {
					return(c ? arguments.callee(m, s, c - 1) : '#') +
						s[m.floor(m.random() * 16)]
				})(Math, '0123456789abcdef', 5)
			}
			//			console.log(getRandomColor());
		</script>
		<script>
			//			这个要求我们对数组做些扩展，map将返回一个数组，然后我们再用join把它的元素串成字符。
			Array.prototype.map = function(fn, thisObj) {
				var scope = thisObj || window;
				var a = [];
				for(var i = 0, j = this.length; i <
					j; ++i) {
					a.push(fn.call(scope, this[i], i, this));
				}
				return a;
			};
			var getRandomColor = function() {
				return '#' + '0123456789abcdef'.split('').map(function(v, i, a) {
					return i > 5 ? null : a[Math.floor(Math.random() * 16)]
				}).join('');
			}
			//			console.log(getRandomColor());
		</script>
		<script>
			//			这个实现非常逆天，虽然有点小bug。我们知道hex颜色值是从#000000到#ffffff，后面那六位数是16进制数，相当于“0x000000”到“0xffffff”。这实现的思路是将hex的最大值ffffff先转换为10进制，进行random后再转换回16进制。我们看一下，如何得到16777215 这个数值的。

//			console.log(parseInt("0xffffff", 16).toString(10));

			var getRandomColor = function() {
				return '#' + Math.floor(Math.random() * 16777215).toString(16);
			}
			//			console.log(getRandomColor());
		</script>
		<script>
			//			基本实现4的改进，利用左移运算符把0xffffff转化为整型。这样就不用记16777215了。由于左移运算符的优先级比不上乘号，因此随机后再左移，连Math.floor也不用了。
			var getRandomColor = function() {

				return '#' + (Math.random() * 0xffffff << 0).toString(16);
			}
			//			console.log(getRandomColor());
		</script>
		<script>
			//			修正上面版本的bug（无法生成纯白色与hex位数不足问题）。0x1000000相当0xffffff+1，确保会抽选到0xffffff。在闭包里我们处理hex值不足5位的问题，直接在未位补零。
			var getRandomColor = function() {

				return '#' + (function(h) {
					return new Array(7 - h.length).join("0") + h
				})((Math.random() * 0x1000000 << 0).toString(16))
			}
			//			console.log(getRandomColor());
		</script>
		<script>
			//			这次在前面补零，连递归检测也省了。
//			使用了立即执行函数获取随机数，使用数组的join()补足16进制颜色的零位.
			var getRandomColor = function() {

				return '#' + ('00000' + (Math.random() * 0x1000000 << 0).toString(16)).substr(-6);
			}
			//			console.log(getRandomColor());
		</script>
		<script>
//			将0-9 a-f储存在数组中，然后每次获取一个随机数，获取6次
			var colorArr = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'];

			function random(min, max) {
				if(isNaN(min) || isNaN(max)) {
					return null;
				}
				if(min > max) {
					min ^= max;
					max ^= min;
					min ^= max;
				}
				return(Math.random() * (max - min) | 0) + min;
			}

			function method1() {
				var color = "#";
				for(var i = 0; i < 6; i++) {
					color += colorArr[random(0, 16)];
				}
				return color;
			}
			console.log(method1())
		</script>
		<script>

//			先获取一个十进制的数（范围为十六进制0-ffffff），然后转换为16进制。toString(16)
//注意，不足6位则前面补零
			function method2() {
				var color = "#";
				for(var i = 0; i < 6; i++) {
					color += (Math.random() * 16 | 0).toString(16);
				}
				return color;
			}
//			console.log(method2())
		</script>
	</body>

</html>